from PyQt5 import QtCore, QtWidgets
from PyQt5.QtWidgets import QMessageBox, QInputDialog
import os,csv
from DPmain import Ui_DP_MainWindow
from database import usedb
from output.progress_logic import progresbar_window
from projectinfo.pile_logic import pile_window
from projectinfo.pile_score_logic import pile_score_window
from projectinfo.proj_logic import proj_window
from system.adduser import adduser_window
from system.users_logic import users_window


class dp_window(Ui_DP_MainWindow):
    def __init__(self):
        super(dp_window, self).__init__()
        self.setupUi(self)
        # 固定窗口大小
        self.setWindowFlags(QtCore.Qt.WindowCloseButtonHint)
        self.setFixedSize(180, 350)
        # 判断是否为管理员
        if usedb.ifadmin!=1:
            self.tbtn_newpro.setEnabled(False)
            self.tbtn_deletepro.setEnabled(False)
            self.tbtn_newpile.setEnabled(False)
            self.tbtn_deletepile.setEnabled(False)
            self.tbtn_checkdata.setEnabled(False)
            self.tbtn_outputpic.setEnabled(False)
            self.tbtn_outputtable.setEnabled(False)
            self.tbtn_newuser.setEnabled(False)
            self.tbtn_deleteuser.setEnabled(False)
        #只有超级管理员才可以查看用户
        if usedb.cur_username!='admin':
            self.tbtn_viewuser.setEnabled(False)

        self.setStyleSheet(
            """
            QMainWindow {
            background-color: white; /* 设置背景色为白色 */
            }
            
            QWidget {
            background-color: white; /* 设置背景色为白色 */
            }
            
            QToolBox{
            background-color: white; /* 默认背景色 */
            } 
            
            QToolButton {
            background-color: white; /* 默认背景色 */
            }
            
            QToolButton:hover {
            background-color: #298DFF; /* 鼠标悬停背景色 */
            }
            
            QToolButton:pressed {
            background-color: orange; /* 按下时背景色 */
            }
            
            QToolButton:checked {
            background-color: orange; /* 选中状态背景色 */
            }
            
            QToolButton:disabled {
            background-color: gray; /* 不可用时背景色 */
            }       
            """
            )
        self.show()
        # 添加信号槽,点击“新建项目”执行打开项目窗口proj
        self.tbtn_newpro.clicked.connect(self.new_proj)
        # 添加信号槽,点击“打开项目”执行打开项目窗口proj
        self.tbtn_openpro.clicked.connect(self.open_proj)
        # 添加信号槽,点击“删除项目”执行打开项目窗口proj
        self.tbtn_deletepro.clicked.connect(self.delete_proj)
        # 添加信号槽,点击“添加或修改桩信息”执行打开新建桩窗口pile
        self.tbtn_newpile.clicked.connect(self.new_pile)
        # 添加信号槽,点击“查询桩信息”执行打开查询桩窗口pile
        self.tbtn_viewpile.clicked.connect(self.view_pile)
        # 添加信号槽,点击“删除桩信息”执行打开删除桩窗口pile
        self.tbtn_deletepile.clicked.connect(self.delete_pile)
        # 添加信号槽,点击“导出数据检测”执行dp_cmpi.db数据检测
        self.tbtn_checkdata.clicked.connect(self.check_data)
        # 添加信号槽,点击“导出三个表格”执行打开output窗口
        self.tbtn_outputtable.clicked.connect(self.output_table)
        # 添加信号槽,点击“导出图片”执行打开项目窗口
        self.tbtn_outputpic.clicked.connect(self.output_pic)
        # 添加信号槽,点击“新建用户”执行打开项目窗口
        self.tbtn_newuser.clicked.connect(self.new_user)
        # 添加信号槽,点击“查看用户”执行打开项目窗口
        self.tbtn_viewuser.clicked.connect(self.view_userMain)
        # 添加信号槽,点击“删除用户”执行打开项目窗口
        self.tbtn_deleteuser.clicked.connect(self.delete_userMain)

    def new_proj(self):
        # 添加信号槽,点击“新建项目”执行打开项目窗口proj
        self.projwin = proj_window()  # 创建proj窗体对象
        self.projwin.pbtn_OK.setText("新建")
        self.projwin.query_proj()
        self.projwin.tbw_info.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)

    def open_proj(self):
        # 添加信号槽,点击“打开项目”执行打开项目窗口proj
        self.projwin = proj_window()  # 创建proj窗体对象
        self.projwin.pbtn_OK.setText("打开")
        self.projwin.query_proj()
        self.projwin.tbw_info.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)

    def delete_proj(self):
        # 添加信号槽,点击“删除项目”执行打开项目窗口proj
        self.projwin = proj_window()  # 创建proj窗体对象
        self.projwin.pbtn_OK.setText("删除")
        self.projwin.query_proj()
        self.projwin.tbw_info.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers)

    def new_pile(self):
        # 添加信号槽,点击“添加桩信息”执行打开新建桩窗口pile
        if usedb.cur_proj != '':
            self.pilewin = pile_window()  # 创建pile窗体对象
        else:
            QMessageBox.warning(self, '警告', '请先打开项目！', QMessageBox.Yes)
            return None

    def view_pile(self):
        # 添加信号槽,点击“查询桩信息”执行打开查询桩窗口pile_score
        if usedb.cur_proj == '':
            QMessageBox.warning(self, '警告', '请先打开项目！', QMessageBox.Yes)
            return None
        else:
            self.pilescorewin = pile_score_window()  # 创建pile_score窗体对象
            return None

    def delete_pile(self):
        # 添加信号槽,点击“删除桩信息”执行打开inputDialog窗口
        #根据输入的桩号，在表一、表二和表三中删除桩信息
        #删除桩号对应的图片
        if usedb.cur_proj == '':
            QMessageBox.warning(self, '警告', '请先打开项目！', QMessageBox.Yes)
            return None
        # 1、获取输入的桩号
        del_pile, flag = QInputDialog.getText(self, '删除桩信息', '请输入桩号：')
        # 2、获取当前项目路径和三个表的路径和图片路径
        dir_proj = os.path.join(usedb.cur_path, usedb.cur_proj)
        csv_projinfo = os.path.join(dir_proj, f'{usedb.cur_proj}综合质量评分（表一）.csv')
        csv_piletotal = os.path.join(dir_proj, f'{usedb.cur_proj}汇总信息表（表二）.csv')
        csv_pile = os.path.join(dir_proj, f'{usedb.cur_proj}试验成果及得分表（表三）.csv')
        dir_images = os.path.join(dir_proj, 'images')

        # 3、判断项目中是否存在该桩号，这里仅对汇总信息表进行判断。如果不存在，报错并退出：如果存在，继续执行。
        flag_exists=False
        flag_del=None
        if os.path.exists(csv_piletotal) and flag and usedb.cur_proj!='':
            with open(csv_piletotal, 'r', newline='',encoding='utf-8') as csvfile:
                csvreader = csv.reader(csvfile)
                head = next(csvreader)
                for row in csvreader:
                    if del_pile == row[1]:
                        flag_exists=True
                        flag_del=QMessageBox.question(self, '提示', f'存在{del_pile},是否删除', QMessageBox.Yes|QMessageBox.No)
        else:
            QMessageBox.warning(self, '删除失败', '未选择项目或文件不存在或未输入有效信息', QMessageBox.Ok)
            return None
        if flag_exists==False:
            QMessageBox.warning(self, '删除失败', '不存在该桩号', QMessageBox.Ok)
            return None

        #4、删除三个表对应桩号的信息。
        if flag_exists and flag_del==QMessageBox.Yes:
            try:
                usedb.remove_rows_with_content(csv_projinfo, '桩号', del_pile)
                usedb.remove_rows_with_content(csv_piletotal, '桩号', del_pile)
                usedb.remove_rows_with_content(csv_pile, '桩号', del_pile)
                usedb.rewrite_csv_first_column_indices(csv_projinfo)
                usedb.rewrite_csv_first_column_indices(csv_piletotal)
                QMessageBox.information(self, '删除成功', '删除成功', QMessageBox.Ok)
            except Exception as e:
                print(f"处理文件时出错：{e}")
                QMessageBox.warning(self, '删除失败', '删除失败', QMessageBox.Ok)
                return None
        elif flag_del==QMessageBox.Cancel:
            QMessageBox.warning(self, '删除失败', '删除操作已取消', QMessageBox.Ok)
            return None
        #5、删除图片
        pilepic_path = os.path.join(dir_images, del_pile) + '.jpg'
        if os.path.exists(pilepic_path):
            try:
                os.remove(pilepic_path)
                print(f"文件 {pilepic_path} 已成功删除。")
            except Exception as e:
                print(f"删除文件时发生错误：{e}")
        else:
            # 如果源文件不存在，则显示警告信息
            QMessageBox.warning(None, 'warning', f'未找到文件 {pilepic_path}', QMessageBox.Ok)
    def check_data(self):
        import os
        if usedb.cur_proj == '':
            QMessageBox.warning(self, '警告', '请先打开项目！', QMessageBox.Yes)
            return None
        # 添加信号槽,点击“导出数据检测”执行数据检测
        dir_proj = os.path.join(usedb.cur_path, usedb.cur_proj)
        csv_projinfo = os.path.join(dir_proj, f'{usedb.cur_proj}综合质量评分（表一）.csv')
        csv_piletotal = os.path.join(dir_proj, f'{usedb.cur_proj}汇总信息表（表二）.csv')
        csv_pile = os.path.join(dir_proj, f'{usedb.cur_proj}试验成果及得分表（表三）.csv')
        if usedb.cur_proj!='':
            if os.path.exists(csv_projinfo) and os.path.exists(csv_piletotal) and os.path.exists(csv_pile):
                pilenames1 = usedb.read_column_csv(csv_projinfo, '桩号')
                pilenames2 = usedb.read_column_csv(csv_piletotal, '桩号')
                pilenames3 = usedb.read_column_csv(csv_pile, '桩号')
                if set(pilenames1) == set(pilenames2) and set(pilenames2) == set(pilenames3) and len(pilenames1) != 0:
                    QMessageBox.information(self, '数据检测', '数据检测通过', QMessageBox.Ok)
                else:
                    QMessageBox.warning(self, '数据检测', '数据检测不通过', QMessageBox.Ok)
            else:
                QMessageBox.warning(self, '数据检测', '文件不存在', QMessageBox.Ok)
        else:
            QMessageBox.warning(self, '数据检测', '请先打开项目！', QMessageBox.Ok)

    def output_table(self):
        import os
        if usedb.cur_proj == '':
            QMessageBox.warning(self, '警告', '请先打开项目！', QMessageBox.Yes)
            return None
        # 添加信号槽,点击“导出三个表格”执行打开output窗口
        dir_proj = os.path.join(usedb.cur_path, usedb.cur_proj)
        csv_projinfo = os.path.join(dir_proj, f'{usedb.cur_proj}综合质量评分（表一）.csv')
        csv_piletotal = os.path.join(dir_proj, f'{usedb.cur_proj}汇总信息表（表二）.csv')
        csv_pile = os.path.join(dir_proj, f'{usedb.cur_proj}试验成果及得分表（表三）.csv')
        excel_projinfo = os.path.join(dir_proj, f'{usedb.cur_proj}综合质量评分（表一）.xlsx')
        excel_piletotal = os.path.join(dir_proj, f'{usedb.cur_proj}汇总信息表（表二）.xlsx')
        excel_pile = os.path.join(dir_proj, f'{usedb.cur_proj}试验成果及得分表（表三）.xlsx')
        if usedb.cur_proj!='':
            try:
                usedb.csv_to_excel(csv_projinfo, excel_projinfo)
                usedb.csv_to_excel(csv_piletotal, excel_piletotal)
                usedb.csv_to_excel(csv_pile, excel_pile)
                usedb.merge_same_content_cells(excel_pile, 1)
                usedb.merge_down_empty_cells(excel_pile, 15)
                QMessageBox.information(self, '导出成功', '导出成功', QMessageBox.Ok)
            except Exception as e:
                print(f"处理文件时出错：{e}")
        else:
            QMessageBox.warning(self, '导出失败', '请先选择项目', QMessageBox.Ok)

    def output_pic(self):
        if usedb.cur_proj != '':
            self.progress = progresbar_window()  # 创建progress窗体对象
            # 添加信号槽,点击“导出图片”执行打开项目窗口
        else:
            QMessageBox.warning(self, '警告', '请先打开项目！', QMessageBox.Yes)
            return None


    def new_user(self):
        # 添加信号槽,点击“新建用户”执行打开项目窗口
        self.adduserwin = adduser_window()  # 创建userdig窗体对象
        self.adduserwin.pbtn_login.setText("新建")

    def view_userMain(self):
        # 添加信号槽,点击“查看用户”执行打开项目窗口
        self.userswin = users_window()  # 创建users窗体对象
        self.userswin.pbtn_OK.setText("查看")
        self.userswin.query_user()

    def delete_userMain(self):
        # 添加信号槽,点击“删除用户”执行打开项目窗口
        self.userswin = users_window()  # 创建users窗体对象
        self.userswin.pbtn_OK.setText("删除")
        self.userswin.query_user()
